/**
 *
 */
package br.com.werp.regras.tesouraria.controle;

import br.com.werp.regras.geral.Acesso;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.Relatorio;
import br.com.werp.regras.geral.Suporte;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Dia;
import br.com.werp.regras.geral.util.JRDataSourcePadrao;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.relatorio.RelatorioVO;
import br.com.werp.regras.geral.vos.suporte.EmpresaVO;
import br.com.werp.regras.geral.vos.tabelas.Imposto_calendario;
import br.com.werp.regras.geral.vos.tabelas.Usuario;
import br.com.werp.regras.geral.vos.tesouraria.ImpostoVO;
import br.com.werp.regras.geral.vos.tesouraria.RelatorioImpostoVO;
import br.com.werp.regras.geral.vos.tesouraria.RelatorioImpostosFormVO;
import br.com.werp.regras.tesouraria.integracao.FabricaDAO;
import br.com.werp.regras.tesouraria.integracao.ImpostoDAO;

import org.apache.commons.beanutils.BeanUtils;

import java.sql.Timestamp;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


/**
 * @author marcos
 *
 */
public class ControleImpostosRelatorio {
    public RelatorioVO gerarRelatorioImpostos(Object form, String requisitor,
        String empresa) throws Exception {
        RelatorioImpostosFormVO relatorioImpostosFormVO = new RelatorioImpostosFormVO();
        BeanUtil.copiarVO(form, relatorioImpostosFormVO);

        Map parameters = BeanUtils.describe(form);

        List listaRelatorio = processarRelatorioImpostos(relatorioImpostosFormVO,
                requisitor);
        Acesso acesso = FabricaSubSistema.getAcesso();
        Usuario usuario = new Usuario();
        usuario.setUsur_login(requisitor);

        usuario = (Usuario) Util.get0(acesso.pesquisarUsuarios(usuario));

        Suporte suporte = FabricaSubSistema.getSuporte();
        EmpresaVO empresaVO = new EmpresaVO();
        empresaVO.setEmpr_id(Util.zeroOuInt(empresa));

        empresaVO = (EmpresaVO) Util.get0(suporte.obterEmpresaVO(empresaVO));

        Relatorio relatorio = FabricaSubSistema.getRelatorio();
        parameters.put("usuario", usuario.getUsur_nome());
        parameters.put("data_relatorio",
            new Timestamp(System.currentTimeMillis()));
        parameters.put("empresa", empresaVO.getEmpr_descricao());

        parameters.put(Relatorio.IMAGE_URI, "/tesouraria/imgJasper/");

        return relatorio.processarRelatorio(new JRDataSourcePadrao(
                listaRelatorio), "RelatorioImpostos",
            relatorioImpostosFormVO.getTiporelatorio(), parameters,
            FabricaSubSistema.getTesouraria(), new HashMap(), new HashMap());
    }

    public List processarRelatorioImpostos(
        RelatorioImpostosFormVO relatorioImpostosFormVO, String requisitor)
        throws Exception {
        ImpostoVO impostoVO = new ImpostoVO();

        impostoVO.setImpt_descricao(relatorioImpostosFormVO.getDescricao());
        impostoVO.setImpt_cod_recolhim(relatorioImpostosFormVO.getCod_recolhimento());

        ImpostoDAO impostoDAO = FabricaDAO.getImpostoDAO();

        Dia inicioVigencia = null;
        Dia fimVigencia = null;

        if (!Util.isNullOrEmpty(relatorioImpostosFormVO.getInicio_vigencia())) {
            inicioVigencia = new Dia(relatorioImpostosFormVO.getInicio_vigencia());
        }

        if (!Util.isNullOrEmpty(relatorioImpostosFormVO.getFim_vigencia())) {
            fimVigencia = new Dia(relatorioImpostosFormVO.getFim_vigencia());
        }

        List impostos = impostoDAO.pesquisarImpostoVO(impostoVO,
                inicioVigencia, fimVigencia);

        List retornoImposto = new LinkedList();

        for (Iterator iter = impostos.iterator(); iter.hasNext();) {
            impostoVO = (ImpostoVO) iter.next();

            Imposto_calendario imposto_calendario = new Imposto_calendario();
            imposto_calendario.setImca_imposto(impostoVO.getImpt_id());

            List calendarios = impostoDAO.pesquisaImpostoCalendario(imposto_calendario);

            for (Iterator iterator = calendarios.iterator();
                    iterator.hasNext();) {
                imposto_calendario = (Imposto_calendario) iterator.next();

                if (!Util.isNullOrEmpty(
                            relatorioImpostosFormVO.getDatainicioapuracao()) &&
                        !Util.isNullOrEmpty(
                            relatorioImpostosFormVO.getDatafinalapuracao())) {
                    Dia inicio = new Dia(relatorioImpostosFormVO.getDatainicioapuracao());
                    Dia fim = new Dia(relatorioImpostosFormVO.getDatafinalapuracao());

                    if (!(inicio.menorIgualA(
                                new Dia(
                                    imposto_calendario.getImca_periodo_inicio())) &&
                            fim.maiorIgualA(
                                new Dia(
                                    imposto_calendario.getImca_periodo_fim())))) {
                        continue;
                    }
                }

                RelatorioImpostoVO relatorioImpostoVO = new RelatorioImpostoVO();

                BeanUtil.copiarVO(impostoVO, relatorioImpostoVO);

                BeanUtil.copiarVO(imposto_calendario, relatorioImpostoVO);

                retornoImposto.add(relatorioImpostoVO);
            }
        }

        return retornoImposto;
    }

    public static void main(String[] argr) throws Exception {
        ControleImpostosRelatorio controleImpostosRelatorio = new ControleImpostosRelatorio();

        RelatorioImpostosFormVO relatorioImpostosFormVO = new RelatorioImpostosFormVO();
        relatorioImpostosFormVO.setTiporelatorio(Relatorio.TIPO_HTML);

        Util.verRelartorio(controleImpostosRelatorio.gerarRelatorioImpostos(
                relatorioImpostosFormVO, "", ""));
    }
}
